iT邦幫忙

2025 iThome 鐵人賽

DAY 2
0
自我挑戰組

與AI搶奪意識ing系列 第 2

隊友做了GOOGLE三方登入,但我看得霧煞煞

  • 分享至 

  • xImage
  •  

看不懂的地方,基本上我會先請ai做個流程圖給我看看:

【A】使用者按「用 Google 登入」
【B】把使用者導到 Google 授權頁(顯示要同意的資料範圍)
【C】使用者在 Google 同意授權
【D】Google 重導回你的回呼網址,夾帶一次性代碼(authorization code)
【E】你的後端帶著 code 與 client secret 向 Google 交換取得 token
【F】取得 ID Token(JWT,內含 email 等基本身分)
【G】驗證 ID Token(簽章、iss、aud、exp)並檢查 state(防 CSRF)
【H】用 Access Token 向 Google 取回使用者允許的基本資料(如 email)
【I】在本系統建立或查找該使用者
【J】建立本系統的登入狀態(session 或自家 JWT)

接著我針對我看不懂的每個地方細節再發問。

【A】使用者按「用 Google 登入」
Q:按鈕..哪裡來?
A:自己做...帶去GOOGLE授權頁

【B】把使用者導到 Google 授權頁(顯示要同意的資料範圍)
Q:怎麼去授權頁?
A:是產生一個特定格式的網址(OAuth 2.0 授權連結),讓使用者點下去,Google 就會跳出授權畫面。https://accounts.google.com/o/oauth2/v2/auth?
client_id=你的ClientID
&redirect_uri=你的回呼網址
&response_type=code
&scope=你要的資料範圍
&state=隨機字串(防 CSRF)
&access_type=offline(如果你要 refresh token)

【C】使用者在 Google 同意授權

【D】Google 重導回你的回呼網址,夾帶一次性代碼(authorization code)
Q:一次性代碼(authorization code)?
A:使用者授權完,Google 把人導回你的後端(redirect_uri),這時會夾帶這個 authorization code(放在 URL 上,https://yourdomain.com/auth/callback?code=4/0Ad8xEzkxxxxyyyy&state=abc123

【E】你的後端帶著 code 與 client secret 向 Google 交換取得 token
Q:我要用這個再發一次post?
A:是的,這一步是要再發一個 POST 請求到 Google,用剛剛拿到的 authorization code 換取真正的 token(access_token、id_token 等)。

【F】取得 ID Token(JWT,內含 email 等基本身分)
Q:這是google回傳的資料?
A:對,ID Token是 Google 在你用 authorization code 成功發 POST 交換後回傳的資料之一。
Q:JWT?
A:JWT 全名是:JSON Web Token,是一種用來「安全傳遞使用者資訊」的格式。是在 Google 三方登入中,用來代表使用者的「身分證」,叫做 ID Token。

【G】驗證 ID Token(簽章、iss、aud、exp)並檢查 state(防 CSRF)
Q:這邊的驗證是指什麼?我要怎驗證?
A:驗證 ID Token(JWT)包含:
1. 驗簽名(最重要)
確保這個 Token 是 Google 簽出來的,不是偽造的。
做法是:用 Google 提供的公鑰,對這段 token 驗證。
2. 驗證 aud(audience)
Token 的 aud(觀眾)要是你的 client_id,這樣才是發給你的服務,不是別人的。
3. 驗證 iss(issuer)
iss 要是 Google 發行者,例如:
https://accounts.google.com(常見)
4. 驗證 exp(過期時間)
不能超時。通常這張 Token 只有幾分鐘到一小時內有效。
如何驗證?(Python 範例):用 Google 官方的 google-auth 套件就可以自動做完以上四件事。
(AI有提供了相關驗證範例,還有驗證結果若有誤會回傳什麼,但這邊就不貼上來了)

【H】用 Access Token 向 Google 取回使用者允許的基本資料(如 email)
Q:Access Token 就是id token?
A:Access Token 跟 ID Token 是兩種不同的東西。雖然它們都是 Google 回傳給你的憑證,但用途、內容、型式都不一樣。ID Token 是 Google 證明「這個人是小明」的數位身分證,Access Token 是 Google 說「小明已經授權你幫他做事」的通行證。
Q:為什麼 Access Token 不需要驗證?
A:因為 Access Token 的用途是:用來向 Google 的 API 說:「使用者授權我可以幫他做某些事(例如讀 email、讀基本資料)」,這張 Access Token 只會被送去 Google 的 API 伺服器使用,Google 自己會驗證這張 Token 是不是有效。

【I】在本系統建立或查找該使用者
Q:剛剛到現在為止,我系統完全都沒見利用google登入的使用者耶?
A:這一步就是要「把 Google 認證過的這個人,對應到我們自己系統的帳號」。
這個 email 在我們資料庫已經有了嗎?
→ 有:直接登入,更新 last_login
→ 沒有:自動幫他註冊一筆帳號(通常用 email + Google ID)
Google 三方登入只幫你做「身分確認」,你還要自己做「帳號對應」和「登入處理」。

【J】建立本系統的登入狀態(session 或自家 JWT)
到這邊為止,session就跟自己做登入狀態的紀錄方式差不多了。


上一篇
嘗試在Synology NAS佈署
下一篇
關於PCI DSS標準?
系列文
與AI搶奪意識ing5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言